class: inverse,left, middle background-image: url(background.png) background-size: cover <img src="data:image/png;base64,#LOGO_DIPLOMADO.png" width="500px"/> ##Módulo 2: Análisis espacial y Percepción remota satelital óptica ### Indices Espectrales Matías Pérez Evens <br> matias.perez@pucv.cl<br> .large[<b><a href="https://www.pucv.cl/uuaa/site/edic/base/port/labgrs.html">LabGRS</a> | Noviembre 2025</b>] <br> --- class: center,middle background-image: url(data:image/png;base64,#labgrs_logo.png) background-size: 35% --- ## Contenidos .pull-left[ * ¿Qué son los índices espectrales? * Clasificación de índices espectrales * Índices espectrales * Vegetacion * Agua * Nieve * Area quemada ] .pull-right[ <img src="data:image/png;base64,#https://raw.githubusercontent.com/allisonhorst/stats-illustrations/main/rstats-artwork/r_rollercoaster.png" width="650px"/> ] --- ### ¿Qué son los índices espectrales? Los **índices espectrales** son combinaciones matemáticas de reflectancias en distintas longitudes de onda —en nuestro caso, a través las bandas espectrales— que permiten resaltar o discriminar con mayor claridad ciertos elementos presentes en una imagen. Al ser <b>índices</b> **espectrales**, es muy importante conocer la firma espectral del objeto para comprender la lógica del índice aplicado. Los índices espectrales se construyen a partir de las propiedades de **absorción y reflectancia** de los objetos estudiados, y por ende se construye a través de la <b>relación entre diferentes regiones del espectro electromagnético</b>. <center><img src="data:image/png;base64,#ndvi_ndwi.jpg" height="300px" /></center> --- ### Clasificación de índices espectrales Los índices espectrales son una de las formas más directas de derivar información cuantitativa desde imágenes satelitales. Entre los grupos principales se distinguen los <b>índices de diferencia normalizada</b> y los <b>no normalizados</b>. -- **Diferencia normalizada:** Se construyen a partir de dos bandas cuya respuesta espectral es contrastante para el objeto de interés. Se calcula la <b>resta</b> entre la banda de mayor reflectancia y la de menor reflectancia, y luego se <b>normaliza</b> dividiendo por la suma de ambas. Esta normalización nos entrega un rango útil del índice entre **-1 y +1**, donde los valores positivos indican mayor diferencia entre las bandas utilizadas para crear el índice, y por ende, una mayor dominancia espectral del objeto estudiado. -- **No normalizados:** Se construyen a partir de dos o más bandas. Estos índices <b>no poseen rango fijo</b> y pueden exceder ±1, ya que no están normalizados (no se dividen por la suma de las partes), y su interpretación depende directamente de la operación empleada y de la relación espectral entre las bandas utilizadas. --- ### Tipos de Índices Espectrales <b>Comportamiento espectral de la vegetación</b> El comportamiento espectral de la vegetación está determinado por la <b>interacción de la radiación con la estructura foliar y la composición bioquímica de los tejidos</b>. En general, la reflectancia de la vegetación se caracteriza **por presentar diferencias entre las regiones del espectro visible y el infrarrojo cercano.** .pull-left[ En el visible (~400-700 nm), la reflectancia es baja debido a la fuerte <b>absorción por pigmentos</b>, especialmente clorofilas (y en menor medida carotenoides y flavonoides). La clorofila presenta máximos de absorción en el azul y en el rojo (~440 nm y ~660 nm, respectivamente), ya que estas longitudes de onda son las necesarias para los procesos fotoquímicos de la <b>fotosíntesis</b>. En cambio, la región verde (~550 nm) **es menos absorbida por la planta**, lo que genera el "efecto campana" en la reflectancia y explica por qué la vegetación sana se observa en tonalidades verdes. ] .pull-right[ <center><img src="data:image/png;base64,#mesofilo.jpg" height="400px" /></center> ] --- <b>Comportamiento espectral de la vegetación</b> .pull-left[ En la región del <b>infrarrojo cercano</b>, (~800-1200 nm), ocurre una reflectancia muy alta controlada principalmente por la <b>estructura interna del mesófilo:</b> la matriz de espacios intercelulares y discontinuidades aire-agua produce múltiples reflexiones internas que incrementan la reflectancia obserbada. Este comportamiento es sensible a **biomasa foliar, espesor del mesófilo, área foliar y estado hídrico estructural.** Y por último, en el <b>SWIR</b> (~1500-2500 nm), la reflectancia disminuye nuevamente debido a las bandas de <b>absorción del agua</b> contenida en la hoja; estas regiones son sensibles al contenido hídrico, lignina y celulosa. ] .pull-right[ <center><img src="data:image/png;base64,#firma_hoja.jpg" height="450px" /></center> ] --- ### Índices espectrales de vegetación <center><img src="data:image/png;base64,#indices_veg.jpg" height="500px" /></center> --- ### Índices espectrales de vegetación <center><img src="data:image/png;base64,#lai.jpg" height="500px" /></center> --- ### Índices espectrales de vegetación ``` r # librerias necesarias library(tidyverse) library(terra) # Abrir imagen Landsat lc_08 <- list.files( path = "ruta_a_tu_carpeta_Landsat", pattern = glob2rx("*T1_SR_B*.TIF"), full.names = T ) %>% rast() # Convertir valores a Reflectancia lc_08 <- lc_08 * 0.0000275 + -0.2 # Renombrar bandas names(lc_08) <- c("B1", "B2", "B3", "B4", "B5", "B6", "B7") # Cálculo de Normalized Difference Vegetation Index NDVI_L8 <- (lc_08$B5 - lc_08$B4) / (lc_08$B5 + lc_08$B4) plot(NDVI_L8, range = c(-1, 1), col = (RColorBrewer::brewer.pal(11,"RdYlGn"))) # visualización ``` --- ### Índices espectrales de vegetación <center><img src="data:image/png;base64,#ndvi_l8.jpg" height="500px"/></center> --- ### Tipos de Índices Espectrales <b>Comportamiento espectral del agua</b> .pull-left[ El agua presenta <b>muy baja reflectancia</b>, concentrada principalmente en el <b>rango visible</b>, con una <b>disminución progresiva</b> a medida que aumenta la lonigtud de onda: refleja mas en el <b>azul</b> y cada vez menos hacia el <b>rojo</b>, llegando a valores cercanos a un 0% de reflectancia en las longitudes <b>infrarrojas</b>. Su comportamiento espectral varía según la presencia de <b>material particulado en suspensión, microorganismos, contenido de clorofila, rugosidad superficial y profundidad,</b> que alteran la cantidad de luz dispersada o abosrbida en la columna de agua.(Manzano, 2004). ] .pull-right[ <center><img src="data:image/png;base64,#water_refl.png" width="auto" /></center> ] --- ### Comportamiento espectral del agua <br> <center><img src="data:image/png;base64,#water_colors.jpg" height="400px"/></center> --- ### Comportamiento espectral del agua <br> <center><img src="data:image/png;base64,#sedimentos.jpg" height="400px"/></center> --- ### Índices Espectrales de Agua <center><img src="data:image/png;base64,#NDWI.jpg" height="500px"/></center> --- ### Índices Espectrales de Agua ``` r # Cálculo de Normalized Difference Water Index (McFeeters) NDWI_McF <- (lc_08$B3 - lc_08$B5) / (lc_08$B3 + lc_08$B5) plot(NDWI_McF, range = c(-1, 1), col = (RColorBrewer::brewer.pal(9,"Blues"))) # visualización ``` <center><img src="data:image/png;base64,#NDWI_l8.jpg" height="400px"/></center> --- ### Tipos de Índices Espectrales <b>Comportamiento espectral de la nieve</b> .pull-left[ La nieve presenta una <b>reflectancia muy alta en el visible</b>, alcanzando un peak marcado que luego <b>desciende rápidamente</b> hacia el <b>infrarrojo cercano</b>, donde la absorción aumenta de forma significativa. Su firma espectral varía según el <b>grado de compactación</b>, el <b>tamaño de los cristales</b>, y el <b>nivel de pureza</b>, factores que controla la cantidad de luz reflejada y la eficacia de la absorción dentro de la cobertura nival. (Pérez & Muñoz, 2006). ] .pull-right[ <center><img src="data:image/png;base64,#firma_nieve.jpg" width="auto" /></center> ] --- ### Indices espectrales de nieve <center><img src="data:image/png;base64,#ndsi.jpg" height="450px"/></center> --- ### Indices espectrales de nieve ``` r # Cálculo de Normalized Difference Snow Index (1) NDSI_01 <- (lc_08$B2 - lc_08$B6) / (lc_08$B2 + lc_08$B6) plot(NDSI_01, range = c(-1, 1), col = (RColorBrewer::brewer.pal(11, "YlGnBu"))) # visualización ``` <center><img src="data:image/png;base64,#ndsi_l8.jpg" height="400px"/></center> --- ### Otros Índices espectrales: <b>*Normalized Burn Ratio (NBR)*</b> <center><img src="data:image/png;base64,#dnbr_firma.jpg" height="450px"/></center> --- ### Otros Índices espectrales: <b>*Normalized Burn Ratio (NBR)*</b> <center><img src="data:image/png;base64,#nbr.jpg" height="400px"/></center> --- ### Índice de Área Quemada <b> Imagen Sentinel-2 Nivel 2 (L2A): Zona Megaincendio Viña del Mar (Febrero, 2024) </b> ``` r # Abrimos nuestras imagenes Sentinel 2 # y seleccionamos las bandas RGB-NIR-SWIR2 #pre incendio S2_pre_fire <- rast("Mosaic_RGB_pre_fire.tif")[[c(2,3,4,5,11)]] S2_pre_fire[S2_pre_fire == 0] <- NA # Eliminar valores 0 #pos incendio S2_pos_fire <- rast("Mosaic_RGB_post_fire.tif")[[c(2,3,4,5,11)]] # seleccionar bandas RGB-NIR-SWIR2 S2_pos_fire[S2_pos_fire == 0] <- NA # Eliminar valores 0 # Renombrar las bandas satelitales names(S2_pre_fire) <- c("BLUE","GREEN","RED","NIR","SWIR2") names(S2_pos_fire) <- c("BLUE","GREEN","RED","NIR","SWIR2") # visualizar: par(mfrow = c(1,2)) plotRGB(S2_pre_fire, r = 3, g = 2, b = 1, stretch = "lin", colNA = "white", axes = T) plotRGB(S2_pos_fire, r = 3, g = 2, b = 1, stretch = "lin", colNA = "white", axes = T) dev.off() ``` --- ### Índice de Área Quemada <b> Normalized Burn Ratio (NBR): </b> <center><img src="data:image/png;base64,#incendio_rgb.jpg" height="400px"/></center> --- ### Índice de Área Quemada <b> Normalized Burn Ratio (NBR): </b> Un valor alto de NBR indica **vegetación sana**, mientras que un valor bajo indica suelo desnudo o **áreas recientemente quemadas**. La fórmula para calcular el NBR es la siguiente: $$ NBR = \frac{NIR - SWIR}{NIR + SWIR} $$ ``` r ## Calculo del indice NBR #Imagen antes del incendio NBR_PRE <- (S2_pre_fire$NIR-S2_pre_fire$SWIR2) / (S2_pre_fire$NIR+S2_pre_fire$SWIR2) #Imagen después del incendio NBR_POS <- (S2_pos_fire$NIR-S2_pos_fire$SWIR2) / (S2_pos_fire$NIR+S2_pos_fire$SWIR2) par(mfrow = c(1,2)) plot(NBR_PRE, range = c(-1, 1), main = "NBR pre-Incendio", col = (RColorBrewer::brewer.pal(11, "BrBG"))) # visualización plot(NBR_POS, range = c(-1, 1), main = "NBR pos-Incendio", col = (RColorBrewer::brewer.pal(11, "BrBG"))) # visualización ``` --- ### Índice de Área Quemada <center><img src="data:image/png;base64,#nbr_pre_pos_br.jpg" height ="400px"/></center> --- ### <b>Otros Índices espectrales:</b> **Delta** <b>*Normalized Burn Ratio (dNBR)*</b> <center><img src="data:image/png;base64,#dnbr.jpg" height="400px"/></center> --- ### <b>Otros Índices espectrales: dNBR</b> ``` r # Cálculo indice dNBR dNBR_vina <- (NBR_PRE - NBR_POS) * 1000 # visualización plot(dNBR_vina, range = c(-200, 600), col = rev(RColorBrewer::brewer.pal(11,"RdYlGn"))) ``` <center><img src="data:image/png;base64,#dnbr_1.jpg" height="400px"/></center> --- ### <b>Otros Índices espectrales: dNBR</b> <center><img src="data:image/png;base64,#tabla_dnbr.jpg" height="200px"/></center> ``` r # Eliminar zonas "no quemadas" (de acuerdo a tabla) dNBR_vina[dNBR_vina <= 100] <- NA # Visualizar RGB pre-incendio (para contexto) plotRGB(S2_pre_fire, r = 3, g = 2, b = 1, stretch = "lin", colNA = "white", axes = T) #Agregar dNBR de zonas quemadas plot(dNBR_vina, range = c(-500, 500), add = T, col = RColorBrewer::brewer.pal(9,"Reds")) ``` --- ### <b>Otros Índices espectrales: dNBR</b> <center><img src="data:image/png;base64,#dnbr_2.jpeg" height="520px"/></center> --- ### Cálculo multiple de índices con RStoolbox Dentro de RStudio disponemos de librerías especializadas para la estimación de índices de forma simultánea. La función **spectralIndice** de la librería **RStoolbox** nos permite obtener diferentes índices espectrales a partir de las bandas disponibles. ``` r # install.packages("RStoolbox") library(RStoolbox) stack_indices <- spectralIndices(img = S2_pre_fire, blue = "BLUE", green = "GREEN", red = "RED", nir = "NIR", scaleFactor = 10000, indices = c("NDVI", "EVI")) evi_palette <- colorRampPalette(c("grey","#EEEEE0","#F0E68C", "#A2CD5A","#008B00","#556B2F")) # visualización par(mfrow = c(1, 2)) plot(stack_indices[[1]], range = c(-0.2,0.7), col = viridis::viridis(11), main = "NDVI index") plot(stack_indices[[2]], range = c(-0.1,0.2), col = evi_palette(200), main = "EVI index") ``` --- ### Cálculo multiple de índices con RStoolbox <center><img src="data:image/png;base64,#rstoolbox.jpg" height="auto"/></center> <a href="https://rdrr.io/cran/RStoolbox/man/spectralIndices.html#:~:text=passed%20to%20writeRaster-,Details,-spectralIndices%20calculates%20all"><i>Ver **detalles** para mas información de índices disponibles en la función **spectralIndices**</i></a> --- ### Bibliografía Asrar, G. Q., Fuchs, M., Kanemasu, E. T., & Hatfield, J. L. (1984). Estimating absorbed photosynthetic radiation and leaf area index from spectral reflectance in wheat 1. Agronomy journal, 76(2), 300-306. Emilio Chuvieco Teledeteccion Ambiental. La Observacion de la Tierra Desde el Espacio. Hamlyn G. Jones and Robin A. Vaughan. Remote sensing of vegetation. Item 7- Use of spectral information for sensing vegetation properties and for image classification. Editorial Oxford. ISBN 978-0-19-920779-4. R.O. Chávez, J.G.P.W. Clevers, M. Herold, M. Ortiz, E. Acevedo, Modelling the spectral response of the desert tree Prosopis tamarugo to water stress, International Journal of Applied Earth Observation and Geoinformation, Volume 21. https://doi.org/10.1016/j.jag.2012.08.013. Jia, Xiuping. Remote Sensing Digital Image Analysis: An Introduction. 10.1007/3-540-29711-1. Thenkabail, P.S. Remote Sensing Handbook Vol. 1: Remotely sensed data characterization, classification, and accuracies. Taylor & Francis Group. Wegmann M., Leutner B., Dech S. Remote Sensing and GIS for Ecologists Using Open Source Software. Ed. Pelagic. Teledeteccion Ambiental. La Observacion de la Tierra Desde el Espacio. --- class: middle 